  #define RANGE 3
  // E' il range delle features presenti.
  // #define N_FEATURES  18
  #define N_FEATURES  6
  /// E' il numero di features presenti nel features vector.
  //#define N_ITEMS 846
  #define N_ITEMS 345
  // E' il numero di items presenti nel Data Set.
  // #define N_CLUSTERS 4
  #define N_CLUSTERS 2
  // E' il numero di clusters effettivamente presenti nel Data Set
  //#define MAX_CLUSTERS 20
  #define MAX_CLUSTERS 10
  // E' il massimo numero di clusters cconsentito in un individuo.
  #define EXP_SEP "$"
  // E' il simbolo scelto per separare le espressioni
  #define DIST_TYPE 1.0
  // E' il tipo di  distanza scelto.
  #define K_FOLD    10
  // E' il valore di k per il cross validation test.

  #define DEFAULT_DATA_FILE  "bupa.data"
  // E' il nome del file che contiene il data set.

  enum assign_type {null, match, neigh};
  /* Questa enumerazione � stata definita per denotare i 2 tipi possi-
     bili di assegnazione per un item del Data Set.
  */

  typedef struct data_item {
             double vector[N_FEATURES];
             int cluster;
          };
  /* E' il vettore che contiene gli items del Data Set.
  */


  typedef struct memo_item {
             assign_type assign;
             int cluster;
          };
  /* Questa struttura � utilizzata per costruire il vettore clustering,
     che si trova nella classe Individual. Essa rappresenta un item del
     data set e memorizza a quale cluster � stato assegnato e con che
     tipo di assegnamento.
  */
  
  typedef struct range {
             double avg, dev;
          };
  /* E' il vettore che contiene gli items del Data Set.
  */


  /*
  ++++++++++++++++++++++++ Classe CLUSTER +++++++++++++++++++++++++++++++++
  *** Definita il: 

  La classe Cluster rappresenta un cluster di una clusterizzazione. Esso
  � rappresentato da un'espressione logico-matematica che esprime i va-
  lori assunti dalle features degli items ceh appartengono al cluster.
  Inoltre, il cluster contiene i vari centroidi calcolati sui vari tipi
  di items assegnati alla cluster.*/

  class Cluster
  {
  public:
     Cluster ();
     /* E' la procedura costruttrice della classe. Serve per allocare og-
        getti della classe. */
     Cluster (int position);
     /* E' la procedura costruttrice della classe. IL parametro specifica
        la sua posizione all'interno del vettore di clusters che si trova
        nella classe Individual.
        */
     Tree  *tree_ptr;
     /* E ' il puntatore all'albero di derivazione dell'espressione del 
        cluster.*/
     inline double give_match_cover(){return match_cover;};
     /* Restituisce la copertura di match del cluster. 
     */
      void update_clustering(bool clustering[N_ITEMS]);
     /* Aggiorna il clustering passato come parametro aggiungendovi gli 
        items assegnati al cluster. 
     */
     float comp_clustering_dist(bool clustering[N_ITEMS]);
     /* Calcola la distanza tra il clustering passato come individuo e il 
        vettore di assegnazione dell'individuo. 
     */     
  private:
     char expression[MAX_CHAR_PHENOTYPE];
     /* E' l'espressione che rappresenta il cluster � un espressione di ti-
        po logico matematica.
     */
     int number;
     /* Questa variabile specifica la posizione del cluster nel vettore.
     */
     int label;
     /* E' la label assegnata al cluster. 
     */ 
     bool assignaments[N_ITEMS];
     /* Memorizza gli items del data set assegnati alla cluster.
     */
     double match_centroid[N_FEATURES];
     /* E' il centroide degli items assegnati al cluster in base al match-
        ing.
     */
     double neigh_centroid[N_FEATURES];
     /* E' il centroide degli items assegnati al clusters per vicinanza.
     */
     double total_centroid[N_FEATURES];
     /* E' il centroide di tutti gli items assegnati al cluster.
     */
     double match_cover;
     /* E' la percentuale di copertura rappresentata dal cluster senza gli
        items assegnati per vicinanza.
     */
     double total_cover;
     /*  E'la percentuale di copertura rappresentata da tutti gli items as-
         segnati al cluster.
     */
     int clauses_num;
     /* E' il numero di clausole contenuto nell'espressione che rappresenta
        il cluster.
     */
     double omogeneity;
     /* E' l'omogeneit� del cluster.
     */
     double iop;
     /* E' l'indice di orientamento alla patologia del cluster.
     */
     void comp_match_centroid(memo_item clustering[], data_item data[],
                              int data_num);
     /* Calcola il centroide degli items assegnati al cluster in base al
        matching. Il primo parametro e' il vettore che memorizza il clus-
        tering, il secondo invece e' il vettore che moerizza il data set,
        il terzo, infine, indica il numero di elementi nel data set.
     */
     void comp_neigh_centroid(memo_item clustering[], data_item data[],
                              int data_num);
     /* Calcola il centroide degli items assegnati al clusters per vicinan-
        za. Il primo parametro e' il vettore che memorizza il clustering,
        il secondo invece e' il vettore che moerizza il data set, il terzo,
        infine, indica il numero di elementi nel data set.
     */
     void comp_total_centroid(memo_item clustering[], data_item data[],
                              int data_num);
     /* Calcola il centroide di tutti gli items assegnati al cluster. Il
        primo parametro e' il vettore che memorizza il clustering, il se-
        condo invece e' il vettore che moerizza il data set, il terzo, in-
        fine, indica il numero di elementi nel data set.
     */
     void comp_clauses_num();
     /* Calcola il numero di clausole contenuto nell'espressione che rap-
        presenta il cluster.
     */
     void comp_omogeneity(memo_item clustering[], data_item data[],
                          int data_num);
     /* Calcola l'omogeneit� del cluster. Il primo parametro e' il vettore
        che memorizza il clustering, il secondo invece e' il vettore che
        memorizza il data set, il terzo, infine, indica il numero di ele-
        menti nel data set.
     */
     void comp_iop(memo_item clustering[], data_item data[],
                   int data_num);
      /* Calcola l'indice di orientamento alla patologia del cluster. Il
        primo parametro e' il vettore che memorizza il clustering, il se-
        condo invece e' il vettore che moerizza il data set, il terzo, in-
        fine, indica il numero di elementi nel data set.
      */

     friend class dm_Individual;
     friend ostream &operator<<(ostream &stream, Cluster clust);
     friend ostream &operator<<(ostream &stream, dm_Individual ind);
   };

   // ******************* INSERITORE della classe Cluster ***************
   ostream &operator<<(ostream &stream, Cluster clust);
     /* Stampa su file, tutti i dati del cluster.
     */

